package com.hisense.davidmoten.rtree;

import static java.util.Collections.min;

import java.util.List;

import com.hisense.davidmoten.rtree.geometry.Geometry;
import com.hisense.davidmoten.rtree.internal.Comparators;

/**
 * Uses minimal area increase to select a node from a list.
 *
 * 从候选节点列表中选择使其最小外接矩形（MBR）面积增加最小的节点；
 * 若面积增量相同，则选择当前面积更小的节点。
 * 该策略常用于 R-Tree 的插入过程，尽量减少节点膨胀，提高空间利用率。
 */
public final class SelectorMinimalAreaIncrease implements Selector {

    /**
     * 基于待插入几何的 MBR，使用比较器按以下优先级选择节点：
     * 1) 面积增量最小；
     * 2) 若并列，则原始面积更小；
     * 返回的节点可使树的增长更为紧凑。
     *
     * @param g 待插入的几何对象
     * @param nodes 候选节点列表
     * @return 选中的节点
     */
    @Override
    public <T, S extends Geometry> Node<T, S> select(Geometry g, List<? extends Node<T, S>> nodes) {
        // 按面积增量优先、其次面积进行选择
        return min(nodes, Comparators.areaIncreaseThenAreaComparator(g.mbr()));
    }
}
